/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package parser;

import base.CBase;
import base.CGraphics;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CReader {
	public static LinkedList<String> FilenamesList = new LinkedList<String>();
	public static String CodeDir = "";

	private BufferedReader BReader;
	public boolean EOF = false;
	public int CurrentLineNumber = 0;
	public int CurrentFileNumber;
	public String OldCodeDir;
	private boolean MultipleStringsComment = false;



	public CReader( String Filename ) {
		OldCodeDir = CodeDir;
		Filename = CBase.GetFilename( CodeDir, Filename );
		int Index = Filename.lastIndexOf( '/' ) + 1;
		CodeDir = Filename.substring( 0, Index );
		Filename = Filename.substring( Index );
		
		FilenamesList.add( Filename );
		CurrentFileNumber = FilenamesList.indexOf( Filename );

		InputStream Stream = null;
		try {
			Stream = new FileInputStream( CodeDir + Filename );
		} catch ( FileNotFoundException ex ) {
			CGraphics.Error( "Файл \"" + CodeDir + Filename + "\" не найден."  );
		}

		try {
			BReader = new BufferedReader( new InputStreamReader( Stream, "CP1251" ) );
		} catch ( UnsupportedEncodingException ex ) {
			Logger.getLogger( CParser.class.getName() ).log( Level.SEVERE, null, ex );
		}
	}



	public void Close() {
		try {
			BReader.close();
		} catch (IOException ex) {
			Logger.getLogger(CParser.class.getName()).log(Level.SEVERE, null, ex);
		}
		CodeDir = OldCodeDir;
	}



	public String ReadLine() {
		CurrentLineNumber++;
		String Line = "";
		try {
			if ( ( Line = BReader.readLine() ) == null ) {
				EOF = true;
				return "";
			}
		} catch (IOException ex) {
			CParser.Error( "Невозможно прочитать строку из файла" );
		}
		Line = Line.trim();
		
		if( MultipleStringsComment ) {
			if( Line.endsWith( "*/") ) MultipleStringsComment = false;
			return "";
		} else if( Line.startsWith( "/*") ) {
			MultipleStringsComment = true;
			return "";
		}
		return Line.replaceAll( "\\(\\*", "{" ).replaceAll( "\\*\\)", "}" );
	}



	public String GetFilename() {
		return FilenamesList.get( CurrentFileNumber );
	}



	public static String GetFilename( int FileNumber ) {
		return FilenamesList.get( FileNumber );
	}
}
